package com.chenjt.demo;

import dev.langchain4j.rag.content.Content;
import dev.langchain4j.rag.content.aggregator.ContentAggregator;
import dev.langchain4j.rag.content.aggregator.DefaultContentAggregator;
import dev.langchain4j.rag.query.Query;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 注释：
 * 同一问题的不同问法，按出现答案多到少的排序去排列答案
 *
 * @author chenjt
 * @date 2025/3/12 17:02
 */
public class QueryDemo {


    public static void main(String[] args) {

        /**
         * 同一个问题衍生出来的三个问题
         * 比如：我的名字是
         *      我是谁
         *      我叫什么
         */
        Query query1 = Query.from("1");
        Query query2 = Query.from("2");
        Query query3 = Query.from("3");


        Map<Query, Collection<List<Content>>> queryToContents = Map.of(
                // 问题1有三个答案，分别是1，2，3
                query1,List.of(List.of(Content.from("1"),Content.from("2"),Content.from("3")))
                // 问题2有三个答案，分别是3，4，5
                ,query2,List.of(List.of(Content.from("3"),Content.from("4"),Content.from("5")))
                // 问题3有三个答案，分别是3，5，7
                ,query3,List.of(List.of(Content.from("3"),Content.from("5"),Content.from("7")))
        );

        ContentAggregator contentAggregator = new DefaultContentAggregator();
        // 按照结果出现的次数进行整合，结果出现次数多的，这个结果就出现在前面
        List<Content> aggregate = contentAggregator.aggregate(queryToContents);
        /**
         * 3这个答案出现了3次，5这个答案出现了2次，1，4，2，7这几个答案出现了1次
         * 所以3就排在了最前面
         * 这样就能取得本质上是同一个问题的不同问法的最优解
         * Content { textSegment = TextSegment { text = "3" metadata = {} } }
         * Content { textSegment = TextSegment { text = "5" metadata = {} } }
         * Content { textSegment = TextSegment { text = "1" metadata = {} } }
         * Content { textSegment = TextSegment { text = "4" metadata = {} } }
         * Content { textSegment = TextSegment { text = "2" metadata = {} } }
         * Content { textSegment = TextSegment { text = "7" metadata = {} }
         */
        for (Content content : aggregate) {
            System.out.println(content);
        }

    }


}
